package net.hekka.canyoutalk.share.database;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * 데이터베이스 Connection을 관리하는 클래스
 * @author Jeffrey Ha
 */
public class DatabaseConnector {

    private static final String DEFAULT_DATABASE_URL = "jdbc:mysql://127.0.0.1/hekkalog";
    private static final String DEFAULT_DATABASE_USER = "root";
    private static final String DEFAULT_DATABASE_PASSWORD = "root1234";
    private static final String DEFAULT_DATABASE_TYPE = "com.mysql.jdbc.Driver";
    private Connection dbConnection = null;
    private String dbUrl;
    private String dbUser;
    private String dbPassword;

    /**
     * 기본 생성자
     * @throws java.sql.SQLException
     */
    public DatabaseConnector() throws SQLException {
        try {
            String databaseDriverName = DEFAULT_DATABASE_TYPE;
            Class.forName(databaseDriverName);
        } catch (Exception e) {
            throw new SQLException("No JDBC Driver for Mysql available: " + e.getMessage());
        }
    }

    /**
     * 기본 생성자
     * @param _databaseDriverName 데이터베이스 드라이버명
     * @throws java.sql.SQLException SQL 관련 문제 발생 시
     */
    public DatabaseConnector(String _databaseDriverName) throws SQLException, ClassNotFoundException {
        // setup
        String databaseDriverName = null;


        if (_databaseDriverName != null) {
            databaseDriverName = _databaseDriverName;
        }
        Class.forName(databaseDriverName);

    }

    /**
     * 데이터베이스 Connection을 초기화 한다.
     * @param _dbUrl 데이터베이스 접근 URL
     * @param _dbUser 데이터베이스 접근 사용자ID
     * @param _dbPassword 데이터베이스 접근 비밀번호
     * @return Connection 생성 시 생성관련 정보 문자열
     * @throws java.lang.Exception Connection 생성 실패 시
     */
    public String initConnector(String _dbUrl, String _dbUser, String _dbPassword) throws SQLException, Exception {
        dbUrl = _dbUrl;
        dbUser = _dbUser;
        dbPassword = _dbPassword;

        return initConnector();
    }

    /**
     * 데이터베이스 Connection을 초기화 한다.
     * @return Connection 생성 시 생성관련 정보 문자열
     * @throws java.lang.Exception Connection 생성 실패 시
     */
    public String initConnector() throws SQLException, Exception  {
        // try to connect
        if (dbUrl == null) {
            dbUrl = DEFAULT_DATABASE_URL;
        }
        if (dbUser == null) {
            dbUser = DEFAULT_DATABASE_USER;
        }
        if (dbPassword == null) {
            dbPassword = DEFAULT_DATABASE_PASSWORD;
        }

        setDbConnection(DriverManager.getConnection(dbUrl, dbUser, dbPassword));

        if (getDbConnection() == null) {
            throw new Exception("Failed to get connection to database ");
        }

        // we have connected - print some info
        return "DatabaseConnector Connected to Database: " + getDbConnection().getMetaData().getDatabaseProductName() +
                ", Version: " + getDbConnection().getMetaData().getDatabaseProductVersion();

    }

    /**
     * @return the dbConnection
     */
    public Connection getDbConnection() {
        return dbConnection;
    }

    /**
     * @param dbConnection the dbConnection to set
     */
    public void setDbConnection(Connection dbConnection) {
        this.dbConnection = dbConnection;
    }
}
